Tabelle mit Formularvariablen updaten - PHP-Bug?

Tabelle mit Formularvariablen updaten - PHP-Bug?

am 09.09.2004 18:36:31 von Clemens von Musil

Hallo,

ich sitze an einem sehr seltsamen Problem. Ein html-Formular übergibt via
method="POST" Daten ($id und $name) an ein PHP Script. Dieses Script soll
mit den Formulardaten eine Tabellenreihe updaten.

Soweit, so einfach:

Die Daten aus dem Formular kommen an (print $id; print $name; liefert den
entsprechenden Output.

Daraus erstelle ich das query:
"UPDATE tabelle SET tabelle.nachname='$name' WHERE tabelle.id=$id" und
schicke es ab, es gibt keinen Fehler.

Es folgt eine Abfrage "SELECT * FROM tabelle WHERE id=$id" mit einer
Kontrollausgabe, die bestätigt, daß der neue Name gespeichert ist.

Wenn nun ein zweites Script die Tabelle nach dem Datensatz $id abfragt, ist
das Feld nachname vollkommen leer.


Ich habe die identischen Abfragen mit unterschiedlichen Werten und Variablen
für $name ausprobiert. Dabei zeigte sich:
$name1 = $name;
"... SET nachname=$name1 .."
=> Das Feld ist leer.

$name1 = "aaa".$name."BBB";
=> Das Feld enthält "aaaBBB"

$name = "Peter"
=> Das Feld enthält "Peter"


Irgendwie sieht das nach einem Bug aus, allerdings habe ich bei Google
keinen Hinweis darauf gefunden.

Stand der Dinge: Ich kann KEINE Formulardaten verwenden, um die Tabelle
upzudaten, und ich habe keine Ahnung, wo ich noch suchen soll.

Hat einer eine Lösung/Idee für mich?
Vielen Dank im Voraus,
Clemens von Musil

P.S: Die Fragmente oben sind kein Copy/Paste, eventuelle Tippfehler sind
definitiv nicht Ursache des Problems ;-)

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 09.09.2004 22:28:53 von Niels Braczek

Clemens von Musil schrieb:

> Die Daten aus dem Formular kommen an (print $id; print $name; liefert
> den entsprechenden Output.

Sicher?
11.20. Warum funktionieren meine Formulare nicht?
http://www.dclp-faq.de/q/q-formular-register-globals.html

> Daraus erstelle ich das query:
> "UPDATE tabelle SET tabelle.nachname='$name' WHERE tabelle.id=$id" und
> schicke es ab, es gibt keinen Fehler.

Lass dir die Query ausgeben.

> Es folgt eine Abfrage "SELECT * FROM tabelle WHERE id=$id" mit einer
> Kontrollausgabe, die bestätigt, daß der neue Name gespeichert ist.
>
> Wenn nun ein zweites Script die Tabelle nach dem Datensatz $id
> abfragt, ist das Feld nachname vollkommen leer.

Das kann so nicht sein, wie du es beschreibst.

> Irgendwie sieht das nach einem Bug aus, allerdings habe ich bei Google
> keinen Hinweis darauf gefunden.

Eher sehr unwahrscheinlich.

> Stand der Dinge: Ich kann KEINE Formulardaten verwenden, um die
> Tabelle upzudaten, und ich habe keine Ahnung, wo ich noch suchen soll.

Ich auch nicht, weil du uns alles Wesentliche vorenthältst.

> P.S: Die Fragmente oben sind kein Copy/Paste, eventuelle Tippfehler
> sind definitiv nicht Ursache des Problems ;-)

An was sollen wir dann den Fehler erkennen? Copy&Paste ist die einzig
sinnvolle Art, Codeteile anzugeben.
Lies 1.17. Wie stelle ich meine Frage an die Newsgroup am sinnvollsten?
http://www.dclp-faq.de/q/q-newsgroup-fragen.html

MfG
Niels

--
Gib einem Hungrigen einen Fisch, und er ist für einen Tag satt.
Zeig ihm, wie man angelt, und er pöbelt Dich an, dass er besseres
zu tun hätte, als Schnüre ins Wasser hängen zu lassen.
[David Kastrup in de.comp.text.tex]

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 10.09.2004 00:02:37 von Matthias Esken

Clemens von Musil schrieb:

> Hat einer eine Lösung/Idee für mich?

Wenn dir gar nix mehr einfällt, dann schick mir den Code per Mail. Wenn
die Aussagen in deiner Frage stimmen, dann spendiere ich dir 'nen Kasten
Bier.

Gruß,
Matthias

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 10.09.2004 13:52:47 von Clemens von Musil

Hallo Niels,

sorry, der Originalcode stammt aus einem mittelgroßen Pojekt, und ich
dachte nicht, daß sich jemand da hineinarbeiten würde. Ich habe gehofft,
daß die Symptome ganz typisch für irgendetwas ist...
Ich habe den Fehler gefunden, allerdings macht das den Fall für mich
noch rätselhafter.
Zuerst eine hoffentlich bessere Beschreibung der Symptome, und weiter
unten den Fehler, den ich gefunden habe mit der Frage, ob Du verstehst,
was das soll.

Also los:

> Sicher?

Ja, ich habe den zusammengesetzten Query ausgegeben. Sieht OK aus:

UPDATE power_subscriptions
SET power_subscriptions.name = 'sqdwq',
power_subscriptions.vorname = 'hhdhh',
power_subscriptions.alter = '',
power_subscriptions.ort = "zdf",
power_subscriptions.anschrift = "",
power_subscriptions.termin = '-1'
WHERE (power_subscriptions.id = 14)

Und zwar als Resultat von:
$query = "UPDATE $SUBSCRIBERTABLE
SET $SUBSCRIBERTABLE.name = '".$_POST['nameNeu']."',
$SUBSCRIBERTABLE.vorname = 'hhdhh',
$SUBSCRIBERTABLE.alter = '$alterNeu',
$SUBSCRIBERTABLE.ort = \"".trim("zdf")."\",
$SUBSCRIBERTABLE.anschrift = \"\",
$SUBSCRIBERTABLE.termin = '-1'
WHERE ($SUBSCRIBERTABLE.id = 14)";

$alterNeu ist eine Formularvariable ($nameNeu natürlich auch).

>>Es folgt eine Abfrage "SELECT * FROM tabelle WHERE id=$id" mit einer
>>Kontrollausgabe, die bestätigt, daß der neue Name gespeichert ist.
>>
>>Wenn nun ein zweites Script die Tabelle nach dem Datensatz $id
>>abfragt, ist das Feld nachname vollkommen leer.

> Das kann so nicht sein, wie du es beschreibst.

Ist es aber. Um genauer zu sein: Ich habe mit folgender Schleife eine
Wartezeit in das fragliche Script eingefügt:


$a = time();
print "Waiting ...";
while ((time() - $a) < 6) {
}
print " Resume.
";


Während der Wartezeit habe ich in einem zweiten Browserfenster mittels
phpMyAdmin den Inhalt der Tabelle ausgegeben. phpMyAdmin hat während der
Scriptlaufzeit für Name den Wert 'sqdwq' angegeben.
Nach Scriptende war das Feld leer.
Ich würde Dir gerne die URL zu dem Script geben, allerdings schraube ich
dabei an einer Datenbank, deren Inhalt ich nicht ohne weiteres
publizieren darf - eine Testdatenbank habe ich bislang nicht angelegt.

>
>>Irgendwie sieht das nach einem Bug aus, allerdings habe ich bei Google
>>keinen Hinweis darauf gefunden.
>
> Eher sehr unwahrscheinlich.

War so die letzte Hoffnung ;-)

Nicht die allerletzte Hoffnung, denn ich habe den Fehler an einer ganz
anderen Stelle gefunden:

Ganz zu Beginn gibt das Script einen HTML-Kopf aus. Das geschieht mit
folgendem Code:

Das Script:

$htmlStyle = Array(
"css/links.css",
"css/text.css",
"css/table.css"
);
include "include/htmlHead.php";

<...>

Und die htmlHead.php:


<? print $htmlTitle ?>
if (isset($htmlStyle) && ($htmlStyle != "")) {
for ($i=0; $i <= count($htmlStyle); $i++) {
print " type=\"text/css\">\n";
}
}
?>




Dabei gibt die for-Schleife folgende Zeilen aus:





Die letzte Zeile entsteht durch das "<=" im Abbruchkriterium. Sie
verschwindet, wenn das Kriterium nur "$i < count($htmlStyle)" verlangt.
Und ohne diese letzte Zeile funktioniert das ganze Script wunderbar.

Zwar weiss ich jetzt, wie ich mit dem Script weiterkomme, aber warum
sich das Script, respektive die Dartenbank mit dieser fehlerhaften Zeile
so verhalten, ist mir schleierhaft.

Weißt Du da etwas?

Danke schön,
Clemens

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 10.09.2004 14:09:13 von Clemens von Musil

Hallo Matthias,

Deine eMail-Adressen sehen nicht nur eigen aus, sie lassen sich von mir
auch nicht beschicken...
Dann das ganze in abgespeckter Form - und, wohl nicht zu leugnen als
Copy/Paste - hier:

einen Kasten sagst Du? Ich habe die Fehlerursache gefunden - und kann
nach bestem Wissen und Gewissen trotzdem sagen, daß alle aussagen meines
Postings korrekt sind. Zugegebenermaßen ist die Einhaltung der
"Wettbedingungen" aber sehr diskussionsbedürftig ;-)

Im Ernst: Es ist alles exakt so, wie im letzten Posting grob, und unten
etwas präziser beschrieben. Den Fehler habe ich auch gefunden,
allerdings an völlig anderer Stelle. Und ich kann mir auf alles zusammen
gar keinen Reim machen.
Vielleicht weißt Du etwas? Das wäre mir auch einen Kasten, auf jeden
Fall aber einen elfer Wert ;-)

Im Folgenden folgt eine Bescheibung, die im Wesentlichen wie diejenige
in der Antwort auf das Posting von Niels aussieht...

Viele Grüße,
Clemens



> Wenn dir gar nix mehr einfällt, dann schick mir den Code per Mail. Wenn
> die Aussagen in deiner Frage stimmen, dann spendiere ich dir 'nen Kasten
> Bier.
>
> Gruß,
> Matthias

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 10.09.2004 21:02:51 von Niels Braczek

Clemens von Musil schrieb:

> sorry, der Originalcode stammt aus einem mittelgroßen Pojekt, und ich
> dachte nicht, daß sich jemand da hineinarbeiten würde. Ich habe
> gehofft, daß die Symptome ganz typisch für irgendetwas ist...
> Ich habe den Fehler gefunden, allerdings macht das den Fall für mich
> noch rätselhafter.
> Zuerst eine hoffentlich bessere Beschreibung der Symptome, und weiter
> unten den Fehler, den ich gefunden habe mit der Frage, ob Du
> verstehst, was das soll.

> Und zwar als Resultat von:
> $query = "UPDATE $SUBSCRIBERTABLE
> SET $SUBSCRIBERTABLE.name = '".$_POST['nameNeu']."',
> $SUBSCRIBERTABLE.vorname = 'hhdhh',
> $SUBSCRIBERTABLE.alter = '$alterNeu',
> $SUBSCRIBERTABLE.ort = \"".trim("zdf")."\",
> $SUBSCRIBERTABLE.anschrift = \"\",
> $SUBSCRIBERTABLE.termin = '-1'
> WHERE ($SUBSCRIBERTABLE.id = 14)";

Wenn nur 1 Tabelle im Spiel ist, kann und sollte der Qualifier
entfallen, weil die Lesbarkeit erhöht wird. Ansonsten alias verwenden
(UPDATE $SUBSCRIBERTABLE t ... t.name ...). Verwende ionnerhalb der
Query immer Single-Quotes, außerhalb Double-Quotes als Stringbegrenzer.
Auch das erhöht die Übersicht. Dein Statement sähe dann so aus:

$query = "UPDATE $SUBSCRIBERTABLE
SET name = '{$_POST['nameNeu']}',
vorname = 'hhdhh',
alter = '$alterNeu',
ort = '".trim('zdf')."',
anschrift = '',
termin = '-1'
WHERE id=14";

> $alterNeu ist eine Formularvariable ($nameNeu natürlich auch).

Da sich das Alter ständig ändert, gehört es nicht in die Datenbank. Da
gehört das Geburtsdatum/-jahr hin. Aber das hat nichts mit dem Problem
zu tun.

>>> Wenn nun ein zweites Script die Tabelle nach dem Datensatz $id
>>> abfragt, ist das Feld nachname vollkommen leer.
>
>> Das kann so nicht sein, wie du es beschreibst.
>
> Ist es aber. Um genauer zu sein: Ich habe mit folgender Schleife eine
> Wartezeit in das fragliche Script eingefügt:
>
>
> $a = time();
> print "Waiting ...";
> while ((time() - $a) < 6) {
> }
> print " Resume.
";
>

Kennst du sleep()?

> Während der Wartezeit habe ich in einem zweiten Browserfenster mittels
> phpMyAdmin den Inhalt der Tabelle ausgegeben. phpMyAdmin hat während
> der Scriptlaufzeit für Name den Wert 'sqdwq' angegeben.
> Nach Scriptende war das Feld leer.

Dann muss jemand[tm] das Feld zwischen deinem Kontrollzugriff und dem
Skriptende geleert haben.

> Ganz zu Beginn gibt das Script einen HTML-Kopf aus. Das geschieht mit
> folgendem Code:
> [...Code...]
>
> Dabei gibt die for-Schleife folgende Zeilen aus:
>
>
>
>
>
> Die letzte Zeile entsteht durch das "<=" im Abbruchkriterium. Sie
> verschwindet, wenn das Kriterium nur "$i < count($htmlStyle)"
> verlangt. Und ohne diese letzte Zeile funktioniert das ganze Script
> wunderbar.

Ein
error_reporting(E_ALL);
am Anfang des Skriptes hätte dich auf den Zugriff auf einen nicht
existierenden Index hingewiesen.
Bau es mal ein und beseitige möglichst alle Notices, die du bekommst.
Erschrick nicht! ;-)

> Zwar weiss ich jetzt, wie ich mit dem Script weiterkomme, aber warum
> sich das Script, respektive die Dartenbank mit dieser fehlerhaften
> Zeile so verhalten, ist mir schleierhaft.

Den Zusammenhang kann ich so auch nicht erkennen; es wirkt auf mich etwa
wie ein automatisches Rollback nach Auftreten eines Skriptfehlers.
Prüfst du den Fehlerstatus bei *jedem* Zugriff auf die Datenbank?

MfG
Niels

--
Mir fehlen die Kenntnisse, um überhaupt eine Vorstellung davon zu
haben, wo ich ansetzen kann den Fehler zu suchen. Einen
Programmierfehler kann ich aber ausschließen.
[Florian Steyer in dclpi]

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 10.09.2004 23:11:03 von Matthias Esken

Clemens von Musil schrieb:

> Ja, ich habe den zusammengesetzten Query ausgegeben. Sieht OK aus:
>
> UPDATE power_subscriptions
> SET power_subscriptions.name = 'sqdwq',
> power_subscriptions.vorname = 'hhdhh',
> power_subscriptions.alter = '',
> power_subscriptions.ort = "zdf",
> power_subscriptions.anschrift = "",
> power_subscriptions.termin = '-1'
> WHERE (power_subscriptions.id = 14)

Das ist nicht OK, wenn die Datenbank so konfiguriert ist, dass sie sich
wirklich an die SQL-Definitionen für Strings hält. Eine Zuweisung wie
power_subscriptions.anschrift = ""
ist danach nämlich ungültig und muss stattdessen
power_subscriptions.anschrift = ''
geschrieben werden.

> Während der Wartezeit habe ich in einem zweiten Browserfenster mittels
> phpMyAdmin den Inhalt der Tabelle ausgegeben. phpMyAdmin hat während der
> Scriptlaufzeit für Name den Wert 'sqdwq' angegeben.
> Nach Scriptende war das Feld leer.

Das sieht auf den ersten Blick schwer so aus, als würde dort ein
ROLLBACK gefahren, allerdings frage ich mich dann, warum die Datenbank
dir in der Zwischenzeit, also ohne eine bestätigendes COMMIT, die Daten
anzeigen sollte. Hängt da vielleicht noch irgendwie ein "manuelles"
Rollback im Code drin?

> for ($i=0; $i <= count($htmlStyle); $i++) {
> print " > type=\"text/css\">\n";

Wüstes Konstrukt. Mit foreach() wäre dir der Fehler nicht passiert.

> Die letzte Zeile entsteht durch das "<=" im Abbruchkriterium. Sie
> verschwindet, wenn das Kriterium nur "$i < count($htmlStyle)" verlangt.
> Und ohne diese letzte Zeile funktioniert das ganze Script wunderbar.
>
> Zwar weiss ich jetzt, wie ich mit dem Script weiterkomme, aber warum
> sich das Script, respektive die Dartenbank mit dieser fehlerhaften Zeile
> so verhalten, ist mir schleierhaft.

Mein Tipp: Dein Code verwendet irgendwo noch einmal die Variable $i ohne
sie vorher korrekt zu initialisieren.

Gruß,
Matthias

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 11.09.2004 01:02:34 von Matthias Esken

Clemens von Musil schrieb:

> Deine eMail-Adressen sehen nicht nur eigen aus, sie lassen sich von mir
> auch nicht beschicken...

Komisch, von anderen Leuten bekomme ich Post auf die Reply-Adresse.

Gruß,
Matthias

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 11.09.2004 14:04:31 von Clemens von Musil

Hallo Niels,

zuerst einmal Danke für Deine Tips.

> Ein
> error_reporting(E_ALL);
> am Anfang des Skriptes hätte dich auf den Zugriff auf einen nicht
> existierenden Index hingewiesen.
> Bau es mal ein und beseitige möglichst alle Notices, die du bekommst.
> Erschrick nicht! ;-)

Sieht schlimm aus...
Aber schwerwiegendes war wohl nicht dabei. $array[index] wurde sehr oft
angemahnt und netterweise als $array['index'] interpretiert.
Ich habe alle Notices etc. beseitigt, das Script verhält sich allerdings
noch wie gehabt.

> Den Zusammenhang kann ich so auch nicht erkennen; es wirkt auf mich etwa
> wie ein automatisches Rollback nach Auftreten eines Skriptfehlers.
> Prüfst du den Fehlerstatus bei *jedem* Zugriff auf die Datenbank?

Ja, ich benutze fikgende Funktion:

function secure_query($query, $db) {

$result = mysql_query($query, $db);
if (!$result) {
die ("Datenbankfehler.
Fehler: ".mysql_error($db)."


Abfrage: $query

");}
return $result;
}

Ich habe die Schleife korrigiert und darunter noch - von PHP-Seite aus
wohl korrekt - ein fehlerhaftes Tag ausgegeben:

if (isset($htmlStyle) && ($htmlStyle != "")) {
for ($i=0; $i < count($htmlStyle); $i++) {
print " type=\"text/css\">\n";
}
}
print "\n";

Damit verhält sich das ganze fehlerhaft, nach Ende des Scriptes sind
also alle Felder leer.

Es ist wohl nicht der fehlerhafte Zugriff auf das Array $htmlStyle,
sondern die Ausgabe des -Tags.
Ich hätte eigentlich gedacht, daß diese Ausgaben allerhöchstens den
Browser beeinflussen...

Wenn Zeit ist, werde ich den ganzen problematischen Teil extrahieren und
zu einem Miniprogramm verarbeiten. Das ist wohl insgesamt viel
übersichtlicher.


> Da sich das Alter ständig ändert, gehört es nicht in die Datenbank. Da
> gehört das Geburtsdatum/-jahr hin. Aber das hat nichts mit dem Problem
> zu tun.

Als mir eben dieser Gedanke kam, war schon mehr geschrieben, als ich
ändern wollte...

> Kennst du sleep()?

Jetzt schon... Sicherlich auch eine Möglichkeit ;)
Ich habe in der Referenz nach pause(), wait() und solchen Dingen geschaut...

Viele Grüße,
Clemens

Re: Tabelle mit Formularvariablen updaten - PHP-Bug?

am 11.09.2004 19:58:16 von Niels Braczek

Clemens von Musil schrieb:

>> Prüfst du den Fehlerstatus bei *jedem* Zugriff auf die Datenbank?
>
> Ja, ich benutze fikgende Funktion:
>
> function secure_query($query, $db) {
>
> $result = mysql_query($query, $db);
> if (!$result) {
> die ("Datenbankfehler.
Fehler: ".mysql_error($db)."


> Abfrage: $query

");}
> return $result;
> }

Das sieht soweit gut aus.

> Ich habe die Schleife korrigiert und darunter noch - von PHP-Seite aus
> wohl korrekt - ein fehlerhaftes Tag ausgegeben:
>
> if (isset($htmlStyle) && ($htmlStyle != "")) {
> for ($i=0; $i < count($htmlStyle); $i++) {
> print " > type=\"text/css\">\n";
> }
> }
> print "\n";
>
> Damit verhält sich das ganze fehlerhaft, nach Ende des Scriptes sind
> also alle Felder leer.
>
> Es ist wohl nicht der fehlerhafte Zugriff auf das Array $htmlStyle,
> sondern die Ausgabe des -Tags.
> Ich hätte eigentlich gedacht, daß diese Ausgaben allerhöchstens den
> Browser beeinflussen...

So ist das auch. Es ist PHP sozusagen sch...egal, *was* ausgegeben wird,
solange die Ausgabe korrekt erfolgt. Bist du sicher dass die Werte nicht
erst 'verschwinden', wenn das Skript von der kaputten[tm] Seite aus
erneut aufgerufen wird?

> Wenn Zeit ist, werde ich den ganzen problematischen Teil extrahieren
> und zu einem Miniprogramm verarbeiten. Das ist wohl insgesamt viel
> übersichtlicher.

Ja, mach' das mal. Das ist ja zu merkwürdig.

MfG
Niels

--
> Bitte FAQ lesen und Shift-Taste nutzen.
wieso shift-taste? versteh das nicht so ganz.
[Alexander Fleischer in dclpm]